//语音模块
#ifndef _PM20_app_voice_H_
#define _PM20_app_voice_H_

#ifdef __cplusplus
extern "C" {
#endif

/**************************************************************************************** */
typedef struct {
    uint8_t people_command;     // 人感模式，开启为1，关闭为0
    uint8_t jet_command;        // 射流模式 开启为1，关闭为0
    uint8_t power_on_command;    // 开机命令，开启为1，关闭为0
    uint8_t uvc_command;         // UVC 命令，开启为1，关闭为0
    uint8_t electric_heating_command; // 电加热命令
    uint8_t ion_command;         // 强电等离子命令
    uint8_t fan_volume_duct;            // 设置大风量挡位
    uint8_t swing_setting;        // 摆头档位设置
    uint16_t fan_speed_setting;   // 风机目标转速设置
    uint8_t electrical_heating;     // 电加热挡位
    uint8_t fan_speed_pos;          // 挡位
} PM20_Send_Frame;

PM20_Send_Frame send_frame;
/**************************************************************************************** */

// 定义可能的数据命令ID，这些ID应与协议中定义的相对应
// 操作枚举
typedef enum {
    CMD_WAKE_WORD = 0x01,// 唤醒词
    CMD_TURN_ON_OFF_AIR_PURIFIER = 0x02,// 开关净化器
    CMD_VERTICAL_ANDLE = 0x04,//垂直角度
    CMD_LEVEL_ANDLE = 0x08,//水平角度
    CMD_WIND_SPEED = 0x0E,// 风速 1-10
    CMD_TURN_ON_OFF_AUTO_MODE = 0x18,// 开自动模式
    CMD_TURN_ON_OFF_COMFORT_MODE = 0x19,// 开舒适模式
    CMD_TURN_ON_OFF_STRONG_MODE = 0x1A,// 开强劲模式
    CMD_TURN_ON_OFF_HEATING = 0x1B,// 开关加热
    CMD_TEMPERATURE_ADJUSTMENT = 0x1D,// 温度调整 0-40℃
    CMD_OFF_TIMING = 0x46,// 关闭定时
    CMD_TIMING = 0x47,//定时 1-12
    CMD_TURN_ON_OFF_PLASMA = 0x53,// 关开等离子
    CMD_FILTER_LIFE_REMAINING = 0x55,// 滤芯寿命剩余 10 - 100%
    CMD_AIR_QUALITY = 0x56,// 空气质量
    CMD_YES_TURN_ON_STRONG_MODE = 0x57,// 是的打开强劲模式   用于确认  返回0x00
    CMD_CAN_TURN_ON_STRONG_MODE = 0x58,// 可以打开强劲模式   用于确认  返回0x00
    CMD_NOT_NEEDED = 0x59,// 不需要     用于确认  返回0x00
    CMD_WHAT_IS_THE_TEMPERATURE = 0x5A,// 温度多少
    CMD_WHAT_IS_THE_HUMIDITY = 0x5B// 湿度多少
} CommandId;

/********** 发送 ***********/
const int WIND_VERTICAL_DIRECTION[] = {
    0,1,2,3
};
//风向挡位 0 30(45) 90 180
const int WIND_LEVEL_DIRECTION[] = {
    0,1,2,3
};
const int WIND_SPEED[] = {
    1,2,3,4,5,6,7,8,9,10
};
const int TEMPERATURE_ADJUSTMENT[] = {
    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
   10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
   20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
   30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40
};
const int HUMIDITY_ADJUSTMENT[] = {
    30,35,40,45,50,55,60,65,70
};
const int TIMING[] = {
    1,2,3,4,5,6,7,8,9,10,11,12
};

/********** 接收 ***********/
const int REV_FILTER_LIFE_REMAINING[] = {
    0x55, 0x56, 0x57, 0x58, 0x59, 0x5A,
    0x5B, 0x5C, 0x5D, 0x5E, 0x5F
};
const int REV_AIR_QUALITY[] = {
    0x60, 0x61, 0x62, 0x63
};
const int REV_TEMPERATURE[] = {
    0x64, 0x65, 0x66, 0x67, 0x68, 
    0x69, 0x6A, 0x6B, 0x6C, 0x6D, 
    0x6E, 0x6F, 0x70, 0x71, 0x72, 
    0x73, 0x74, 0x75, 0x76, 0x77, 
    0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
    0x7F, 0x80, 0x81, 0x82, 0x83,
    0x84, 0x85, 0x86, 0x87, 0x88,
    0x89, 0x8A, 0x8B, 0x8C, 0x8D
};
const int REV_HUMIDIFIER[] = {
    0x8E, 0x8F, 0x90, 0x91, 0x92,
    0x93, 0x94, 0x95, 0x96, 0x97
};

#define FRAME_HEAD       (0x7E) //命令头(固定) 7E
#define FRAME_COM1       (0xFF) //命令字(固定) FF
#define FRAME_COM2       (0x06) //命令字(固定) 06
#define FRAME_COM3       (0xA0) //命令字(固定) A0   mcu->语音
#define FRAME_END        (0xEF) //结束码(固定) EF
#define DATA_LENGTH1     (0x06) //长度(不包含检验和结束码) 06     语音->mcu
#define DATA_LENGTH2     (0x07) //长度(不包含检验和结束码) 07     mcu->语音
#define VOICE_COM1       (0x01) //命令命令  01    语音->mcu
#define VOICE_COM2       (0x00) //命令命令  00    mcu->语音


// 定义数据帧参数的结构体
typedef struct {
    uint8_t data_length;       // 数据长度 2
    uint8_t *data;             // 语音命令字段  2字节
    uint8_t checksum;          // 校验和
} FrameDataParams;

extern void pm20_app_voice_init(void) ;
int parse_voice_command(const uint8_t *frame, uint16_t frame_length, FrameDataParams *params) ;
void free_frame_data(FrameDataParams *params);
void Process_Rev_data(FrameDataParams *params);

/********外部数据传入接口************************************/

// 滤芯寿命读取接收(滤芯寿命剩余 10 - 100%)
int Cartridge_Life_data(int data);
// 空气质量读取接收(0-优 1-良 2-较差 3-差)
int Air_Quality_data(int data);
// 温度数据读取接收(0 - 41)
int Temperature_data(int data);
// 湿度数据读取接收(10 - 100%)
int Humidity_data(int data);
/**********************************************************/


int voi_switch_auto(void);// 自动模式   等于1开启
int voi_switch_comfort(void);// 舒适模式   等于1开启
int voi_switch_strong(void);// 强劲模式   等于1开启
int voi_switch_time(void);// 定时关闭     等于0关闭 



#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif //_PM20_app_voice_H_